package com.starry.module.system.core.role.mapper;

import com.starry.core.common.domain.vo.PageVo;
import com.starry.db.core.mapper.BaseMapperX;
import com.starry.db.core.query.LambdaQueryWrapperX;
import com.starry.module.system.api.role.domain.qo.SysRolePageQo;
import com.starry.module.system.api.role.domain.vo.SysRoleDtlVo;
import com.starry.module.system.api.role.domain.vo.SysRoleVo;
import com.starry.module.system.core.role.entity.SysRole;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * 系统角色-数据库服务层
 *
 * @author xiaoke
 */
@Mapper
public interface SysRoleMapper extends BaseMapperX<SysRole> {

    /**
     * 分页查询
     *
     * @param pageQo 分页参数
     * @return PageVo<SysRole>
     */
    default PageVo<SysRole> selectPage(SysRolePageQo pageQo) {
        return selectPage(pageQo, new LambdaQueryWrapperX<SysRole>()
                .likeIfPresent(SysRole::getName, pageQo.getName())
                .likeIfPresent(SysRole::getCode, pageQo.getCode())
                .eqIfPresent(SysRole::getDataScope, pageQo.getDataScope())
                .eqIfPresent(SysRole::getStatus, pageQo.getStatus())
        );
    }

    /**
     * 根据Id集合获取是否被使用的角色
     *
     * @return List<SysRole>
     */
    List<SysRole> selectByIdsIsUseRole(@Param("idList") Set<Long> idList);

    /**
     * 根据用户Id获取角色列表
     *
     * @param userId 用户Id
     * @return List<SysRoleVo>
     */
    List<SysRoleVo> selectByUserIdRoleList(Long userId);

    /**
     * 根据角色Id获取菜单Id集合
     *
     * @param roleId 角色Id
     * @return Set<Long>
     */
    Set<Long> getRoleMenuIds(@Param("roleId") Long roleId);

    /**
     * 批量插入角色菜单
     *
     * @param roleId   角色
     * @param menuIds  菜单
     * @param userId   创建人
     * @param username 创建人
     */
    void insertRoleMenu(@Param("roleId") Long roleId, @Param("menuIds") Set<Long> menuIds, @Param("userId") Long userId, @Param("username") String username);

    /**
     * 批量删除角色菜单
     *
     * @param roleId  角色
     * @param menuIds 菜单
     */
    void deleteRoleMenu(@Param("roleId") Long roleId, @Param("menuIds") Set<Long> menuIds);

    /**
     * 根据Id获取详情
     *
     * @param id 角色Id
     * @return SysRoleDtlVo
     */
    SysRoleDtlVo selectByIdDetail(Long id);

    /**
     * 根据条件获取角色列表
     *
     * @param qo 条件
     * @return List<SysRole>
     */
    default List<SysRole> selectRoleList(SysRolePageQo qo) {
        return selectList(new LambdaQueryWrapperX<SysRole>()
                .likeIfPresent(SysRole::getName, qo.getName())
                .likeIfPresent(SysRole::getCode, qo.getCode())
                .eqIfPresent(SysRole::getDataScope, qo.getDataScope())
                .eqIfPresent(SysRole::getStatus, qo.getStatus())
                .orderByDesc(SysRole::getId)
        );
    }
}

